﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using OR.Enumerador;
using System;
using System.Data;
using System.Data.Common;

namespace Dao
{
    public class ContatoDao : IContatoDao<mContato>
    {
        private mContato infoContato;

        public ContatoDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO cadastro.contato(indice, empresa, nome, apelido, telefone1, telefone2, 
                                      telefone3, celular, email, email1, site, fax, fonecomercial)
                                      VALUES (@indice, @empresa, @nome, @apelido, @telefone1, @telefone2, 
                                      @telefone3, @celular, @email, @email1, @site, @fax, @fonecomercial)";

        const string cmdUpdateSQL = @"UPDATE cadastro.contato SET nome=@nome, apelido=@apelido, telefone1=@telefone1, 
                                      telefone2=@telefone2, telefone3=@telefone3, celular=@celular, email=@email, 
                                      email1=@email1, site=@site, fax=@fax, fonecomercial=@fonecomercial ";

        const string cmdDeleteSQL = @"DELETE FROM cadastro.contato ";

        const string cmdSelectSQL = @"SELECT indice, empresa, nome, apelido, telefone1, telefone2, telefone3, celular, 
                                      email, email1, site, fax, fonecomercial FROM cadastro.contato ";

        #endregion
    
        #region Metodos
        bool IContatoDao<mContato>.Inserir(mContato infoContato)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();
                
                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoContato, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch(Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IContatoDao<mContato>.Inserir(mContato infoContato)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IContatoDao<mContato>.Alterar(mContato infoContato, int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText =cmdSQL;
                GeraParametro(ref _cmd, infoContato, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);         
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IContatoDao<mContato>.Alterar(mContato infoContato)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IContatoDao<mContato>.Excluir(int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL += cmdDeleteSQL;
                cmdSQL = "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IContatoDao<mContato>.Excluir(int Indice)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }

        mContato IContatoDao<mContato>.GetContato(int Indice, short Empresa)
        {
            infoContato = new mContato();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    infoContato = GetRdContato(rd);
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mContato IContatoDao<mContato>.GetContato(eEntidade Entidade, int CodigoEntidade)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoContato;
        }        
        #endregion

        #region Metodos privados
        private mContato GetRdContato(DbDataReader rd)
        {
            infoContato = new mContato();

            infoContato.Indice = Convert.ToInt32(rd["indice"]);
            infoContato.Empresa = Convert.ToInt16(rd["empresa"]);
            infoContato.Nome = rd["nome"].ToString();
            infoContato.Apelido = rd["apelido"].ToString();
            infoContato.Telefone1 = rd["telefone1"].ToString();
            infoContato.Telefone2 = rd["telefone2"].ToString();
            infoContato.Telefone3 = rd["telefone3"].ToString();
            infoContato.Celular = rd["celular"].ToString();
            infoContato.Email1 = rd["email"].ToString();
            infoContato.Site = rd["site"].ToString();
            infoContato.Fax = rd["fax"].ToString();
            infoContato.FoneComercial = rd["fonecomercial"].ToString();
            infoContato.Email2 = rd["email1"].ToString();

            return infoContato;
        }
        private void GeraParametro(ref DbCommand _cmd, mContato infoContato, byte Acao)
        {
            _cmd.Parameters.Clear();

            if (Acao == 1) // Parametros gerados somente quando for inclusão de dados
            {
                UtilBD.AdicionaParametro(ref _cmd, "@indice", infoContato.Indice);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoContato.Empresa);
            }
            UtilBD.AdicionaParametro(ref _cmd, "@nome", infoContato.Nome);
            UtilBD.AdicionaParametro(ref _cmd, "@apelido", infoContato.Apelido);
            UtilBD.AdicionaParametro(ref _cmd, "@telefone1", infoContato.Telefone1);
            UtilBD.AdicionaParametro(ref _cmd, "@telefone2", infoContato.Telefone2);
            UtilBD.AdicionaParametro(ref _cmd, "@telefone3", infoContato.Telefone3);
            UtilBD.AdicionaParametro(ref _cmd, "@celular", infoContato.Celular);
            UtilBD.AdicionaParametro(ref _cmd, "@email", infoContato.Email1);
            UtilBD.AdicionaParametro(ref _cmd, "@email1", infoContato.Email2);
            UtilBD.AdicionaParametro(ref _cmd, "@site", infoContato.Site);
            UtilBD.AdicionaParametro(ref _cmd, "@fax", infoContato.Fax);
            UtilBD.AdicionaParametro(ref _cmd, "@fonecomercial", infoContato.FoneComercial);
        }
        #endregion
    }
}
